//
// Created by xili on 2024/8/27 20:53.
// GO BIG OR GO HOME.
//
#include "leetcode.h"

class Solution {
public:
    int countCompleteSubarrays(vector<int> &nums) {
        unordered_set<int> us(nums.begin(), nums.end());
        int need = us.size();  // 所有不同元素的数量
        int n = nums.size();
        int ans = 0;
        unordered_map<int, int> window;
        int left = 0;
        int count = 0;
        for (int right = 0; right < n; right++) {
            // 添加右边的元素到窗口
            if (++window[nums[right]] == 1) {
                count++;
            }
            // 当窗口内包含所有不同元素时
            while (count == need) {
                ans += n - right;  // 此时右边界到末尾的子数组都是完整子数组
                // 左边界右移，缩小窗口
                if (--window[nums[left]] == 0) {
                    count--;
                }
                left++;
            }
        }
        return ans;
    }
};
